import React from 'react';
import EventEmitter from '../EventEmitter'
// import JSONPath from '../module/JSONWatch';
const JSONPath = {}

export default class RenderEngine extends EventEmitter {
  // 组件列表 & 注册页面，可以覆盖已注册的组件
  static componentsMap = new Map();
  // 插件模块，模块名不能重复覆盖
  // 1. 处理 schema 某个部分的实现, 比如 AJAX_PARSER 可以有效处理 action, srouce 部分
  // 2. 提供页面模块之间的通信方式，比如 全局 $QUERY 模块，ftp页面注册的 $FILTER, $TABLE 模块
  // 3. 其他自定义模块，自定义渲染函数，自定义逻辑处理模块等等
  static moduleMap = new Map();

  // 在全局注册一个组件或页面
  static setComponent(path, component) {
    RenderEngine.componentsMap.set(path, component);
  }

  // 在全局注册一个模块，所有实例会共享此模块
  static setModule(name, module) {
    return RenderEngine.moduleMap.set(name, module);
  }

  static getModule(name) {
    return RenderEngine.moduleMap.get(name);
  }

  constructor(componentsMap = RenderEngine.componentsMap, moduleMap = RenderEngine.moduleMap) {
    super();
    // 拷贝一份组件，模块列表，在当前实例新增的组件和模块仅在当前实例生效
    // 组件模块
    this.componentsMap = new Map(componentsMap);
    // 功能模块
    this.moduleMap = new Map(moduleMap);
  }

  // 在当前实例注册模块，其他实例不共享
  setModule(name, module) {
    // if (this.moduleMap.has(name)) {
    //   throw new Error(`setModule error: Module name ${name} already exists`);
    // }
    return this.moduleMap.set(name, module);
  }

  removeModule(name) {
    return this.moduleMap.delete(name);
  }

  getModule(name) {
    return this.moduleMap.get(name);
  }

  /**
   * 从已注册的module中获取变量值
   * path = "${moduleName}.${varPath}"
   * 比如 "$FILTER.abc" $QUERY.def
   * 在 FTP 中支持 $QUERY, $TABLE
   */
  getVariable(path) {
    const paths = path.split('.');
    const moduleName = paths[0];
    const module = this.moduleMap.get(moduleName);
    if (module) {
      return module.getVariable(paths.slice(1).join('.'));
    }
    return undefined;
  }

  /**
   * 批量获取模块内部变量值
   * @params params: {
   *  a:"$TABLE.a",
   *  b:"$FILTER.b",
   *  c: ["$FILTER.a", { f: "$FILTER.c" }]
   * }
   * @return {
   *  a:1,
   *  b:2,
   *  c: [1, {f:2}]
   * }
   *
   */
  getVariableByJSON(params) {
    return JSONPath.getVariableByJSON(params, this);
  }

  /**
   * 从已注册的组件库中获取一个组件
   * 支持 input自己定义组件，Input next组件，DatePicker2.RangePicker 二级组件
   */
  getComponent(type) {
    if (String(type).indexOf('.') > -1) {
      const types = type.split('.');
      let mainComponent = this.componentsMap.get(types[0]);
      for (let i = 1; i < types.length; i++) {
        mainComponent = mainComponent[types[i]];
      }
      return mainComponent;
    }
    return this.componentsMap.get(type);
  }

  // return ReactComponent
  createElement(type, schema, props = {}) {
    const component = this.getComponent(type);
    if (component === undefined) {
      // eslint-disable-next-line no-console
      console.warn(`MDDRenderEngine error type: ${type} not component`);
      return null;
    }

    // 以 /\ 小写字母开头的组件为自定义组件，这里需要传递 schema， engine
    if (/^[/\a-z].?/.test(type)) {
      // eslint-disable-next-line no-param-reassign
      props.schema = schema;
      // eslint-disable-next-line no-param-reassign
      props.engine = this;
    }
    return React.createElement(component, props);
  }

  render(schema) {
    try {
      return this.createElement('page', schema);
    } catch (e) {
      // eslint-disable-next-line no-console
      console.error('MDDRenderEngine render error: ', e);
      return null;
    }
  }
}
